/* eslint-disable no-unused-vars */
const {Client} = require('@elastic/elasticsearch');

const client = new Client({
  // node: 'https://username:password@localhost:9200'
  node: 'http://192.168.21.176:9200'
});

/**
 * 将类型化JSON文档存储在索引中，
 * 使其可搜索。当id参数未设置时，
 * 将自动生成唯一的id。
 * 当您指定一个id时，要么创建一个新文档，
 * 要么更新一个现有文档
 */
async function index () {
  let resp;
  try {
    resp = await client.index({
      index: 'test',
      type: 'aeee',
      id: '6058046316761d2e8752aa4c',
      body: {
        // title: 'hasprice',
        // tags: ['index1', 'index2'],
        // published: true,
        // price: 30
        deleted: false,
        _id: '6058046316761d2e8752aa4c',
        title: '倚天屠龙记4',
        content: '剑心通明4',
        userId: '41',
        isSecret: false,
        group: '中国',
        contentText: '剑心通明4',
        titleText: '倚天屠龙记4',
        id: '6058046316761d2e8752aa4c'
      }
    });
  } catch (e) {
    resp = null;
  }
  return resp;
}

/**
 * 更新文档的部分内容。所需的body参数可以包含以下两种情况之一:
 * 将与现有文档合并的部分文档。
 * 更新文档内容的脚本
 */
async function update (id) {
  let resp;
  // let params = {tags: 'tag1'};
  try {
    resp = await client.update({
      index: 'myindex',
      type: 'mytype',
      id,
      body: {
        //将部分文档放在“doc”属性下
        doc: {
          id,
          title: 'updated',
          hello: 'hahshs'
        }
        //使用脚本向文档标记属性添加标记，1543237871248 存在，会在tag的基础上变化
        //script:`ctx._source.tag  =1`,
        //script:`ctx._source.tag  += ctx._source.tag`,
        //script:`ctx._source.tag  += "${params.tags}"`
        //当文档不存在时，将文档计数器增加1或初始化它 1543237871249为不存在的，当执行此语句时会初始化tag=1
        // script:'ctx._source.tag+=1',
        // upsert:{
        //     tag:1
        // }
        //如果你想让你的脚本运行，不管文档是否存在。脚本处理初始化文档，而不是upsert元素——然后将scripted_upsert设置为true
        /*"scripted_upsert":true,
        "script":{
            "source":"ctx._source.tag=params.tag",
            "params":{
                "tag":"haha"//此时如果文档不存在，会初始化为haha而不是1
            }
        },
        "upsert":{
            tag:"1"
        }*/
        //可以读取参数的写法
        // script:{
        //     "source":"ctx._source.tag+=params.count",
        //     "lang":"painless",
        //     "params":{
        //         "count":4
        //     }
        // }
        //移除tag属性
        // script:{
        //     "source":"ctx._source.remove('tag')"
        // }
        //可用doc来取代upsert功能初始化tag的值
        /*"doc":{
            "tag":"doc"
        },
        "doc_as_upsert":true*/
        //根据query修改符合指定条件的修改
        /*"script":{
            "source":"ctx._source.tag=1",
            "lang":"painless"
        },
        "query":{
            "term":{
                "title":"test2"
            }
        }*/
        //source 也可以用if语句
        // 'script': {
        //   'source': 'if(ctx._source.tag==-1){ctx._source.tag-=1}else{ctx._source.tag+=1}',
        //   'lang': 'painless'
        // }
      }
    });
  } catch (e) {
    resp = null;
  }
  return resp;
}

async function create (id) { //index,type相同时id重复时插入失败
  let resp;
  try {
    resp = await client.create({
      index: 'myindex2',
      type: '_doc',
      id,
      body: {
        deleted: false,
        // _id: '6058046316761d2e8752aa4c44',
        _name: 'hahs',
        title: '倚天屠龙记4',
        content: '剑心通明4',
        userId: '41',
        isSecret: false,
        group: '中国',
        contentText: '剑心通明4',
        titleText: '倚天屠龙记4',
        id: '6058046316761d2e8752aa4c'
      }
    });
  } catch (e) {
    console.error(`create error, `, e);
    resp = null;
  }
  return resp;
}

async function deleteById (id) {
  try {
    await client.delete({
      index: 'myindex',
      type: 'mytype',
      id
    });
  } catch (e) {
    console.error('delete error', e);
  }
  console.log('---delete ok---');
}

/**
 * 根据索引进行删除
 */
async function deleteByIndex (index) {
  try {
    await client.indices.delete({
      index
    });
  } catch (e) {
    console.error('delete error', e);
  }
  console.log('---delete ok---');
}

/**
 * 根据索引和对象中的id进行删除
 */
async function deleteByIndexAndId (index, id) {
  try {
    await client.deleteByQuery({
      index,
      body: {
        query: {
          'bool': {'must': [{'query_string': {'default_field': 'id', 'query': id}}]}
        }
      }
    });
  } catch (e) {
    console.error('delete error', e);
  }
  console.log('---delete ok---');
}

async function count () {
  let resp;
  try {
    resp = await client.count({
      index: 'myindex'
      // body: {
      //     query: {
      //       filtered: {
      //         filter: {
      //           terms: {
      //             title: ['foo']
      //           }
      //         }
      //       }
      //     }
      // }
    });
    console.log('count is ', resp.body.count);
  } catch (e) {
    resp = null;
  }
  return resp;
}

async function reindex (old, index){
  try {
    await client.reindex({
      waitForCompletion: true,
      refresh: true,
      body: {
        source: {
          index: old
          // query: {
          //   match: { character: 'stark' }
          // }
        },
        dest: {
          index: index
        }
        // script: {
        //   lang: 'painless',
        //   source: 'ctx._source.remove("house")'
        // }
      }
    });
  } catch (e){
    console.error(e);
  }
}

(async function () {
  // await reindex('blog', 'blog0325');
  await deleteByIndex('blog0325');
  // await create(11);
  // await update(1);
  // await deleteById(2);
  // await count();
  // await deleteByIndex('20210318');
  // await index();
  // await deleteByIndex('tweets', 1);
  // try {
  //   const result = await client.search({
  //     index: 'myindex',
  //     body: {
  //       query: {
  //         // match: { hello: 'world' }
  //         match_all: {}
  //       }
  //     }
  //   });
  //   console.log(result.body.hits);
  // } catch (e) {
  //   console.error(e);
  // }
})();
